package com.b1.taskmanagerclient.start.gui;

import com.b1.taskmanagerclient.connect.Client;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

/**
 * Класс отрисовки главного окна программы
 * обеспечивает взаимодействие пользователя
 * с логикой программы через графический интерфейс.
 * 
 * @extends JFrame
 */

public class MainWindow extends JFrame 
{
   private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(MainWindow.class);

    private JButton button;                 // кнопки на форме
    private JPanel panel;                   // панель формы
    private JTable table;                   // таблица с задачами
    private JScrollPane scroll;             // прокрутка для таблицы
    private JLabel label = new JLabel();    // лейбл для хранения выбраного id задачи
    private DefaultTableModel modelTable;   // модель таблицы
    private String taskArray[][];           // массив задач
    private Client client;                  // клиентское подключение к серверу
    private JFrame window;                  // обьект текущего окна
    
    /**
     * метод возврата модели таблицы с данными
     * @return
     * @throws InterruptedException 
     */
    public String[][] getDataValuesForTable() throws InterruptedException
    {
        while (!client.isConntect()) Thread.sleep(10); // пока не установиться подключение
        taskArray = client.getTaskList();
        String dataValues[][] = new String[taskArray.length][4];
        for (int i = 0; i < dataValues.length; i++) 
        {
            dataValues[i][0] = taskArray[i][3]; //title
            dataValues[i][1] = taskArray[i][1]; //begin
            dataValues[i][2] = taskArray[i][4]; //type
            dataValues[i][3] = taskArray[i][0]; //id
        }
        
        
        return dataValues;
    }
    
    /**
     * присвоение модели таблицы
     * @param tm 
     */
    public void setTableModel(TableModel tm)
    {
        table.setModel(tm);
    }
    
    /**
     * метод прорисовки таблицы с данными
     * @throws InterruptedException 
     */
    public void paintTable() throws InterruptedException
    {
          
    }
    
    /**
     * конструктор класса
     * принимает имя сервера и порт для подключения
     * создает основное окно программы
     * @param hostName
     * @param port 
     */
    public MainWindow(String hostName, int port)
    {
        super("TaskManager");
        panel = new JPanel();
        panel.setLayout(null);
        final String columnNames[] = {"Task", "Date begin", "Type", "id"};
        //соединение  с сервером
        try 
        {
            client = new Client(hostName, port);
            Thread threadClient = new Thread(client);
            threadClient.setDaemon(true);
            threadClient.start();
            
            modelTable = new DefaultTableModel(getDataValuesForTable(), columnNames);
            modelTable.addTableModelListener(table);
            table = new JTable();
            table.setModel(modelTable);
            ListSelectionModel selModel = table.getSelectionModel();
            selModel.addListSelectionListener(new MainWindow.tableSelectionEvent());
            
            scroll = new JScrollPane(table);
            scroll.setSize(280, 140);
            scroll.setLocation(20, 30);
            table.setPreferredScrollableViewportSize(new Dimension(180, 140));
            
            panel.add(scroll);
        } 
        catch (InterruptedException ex) {
            Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch (java.net.UnknownHostException ex) {
            JOptionPane.showMessageDialog(null, "Failed to connect to server"
                    + "\nCheck the settings\nOr server not avaible", "Error", JOptionPane.PLAIN_MESSAGE);
            new com.b1.taskmanagerclient.start.gui.WindowParamsConnect().setVisible(true);
        } 
        catch (java.io.IOException ex) {
            JOptionPane.showMessageDialog(null, "Failed to connect to server"
                    + "\nCheck the settings\nOr server not avaible", "Error", JOptionPane.PLAIN_MESSAGE);
            new com.b1.taskmanagerclient.start.gui.WindowParamsConnect().setVisible(true);
        }
        
        this.addWindowListener(new java.awt.event.WindowAdapter() 
        {
            /*
             * слушатель для окна когда оно становиться активным
             * перерисовывает данные в таблицe
             */
            public void windowActivated(java.awt.event.WindowEvent e)
            {
                try {
                    modelTable.setDataVector(getDataValuesForTable(), columnNames);
                } 
                catch (InterruptedException ex) {
                    log.error(MainWindow.class.getName(), ex);
                }
                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                javax.swing.table.TableColumn column = table.getColumnModel().getColumn(0);
                column.setPreferredWidth(80);
                column = table.getColumnModel().getColumn(1);
                column.setPreferredWidth(100);
                table.removeColumn(table.getColumnModel().getColumn(3)); // hide id column
                
            }
        });
        
        log.info("Start GUI");
        this.setSize(500, 270);
        try 
        {
            // выравнивание окна по центру
            java.awt.Toolkit jToolkit = java.awt.Toolkit.getDefaultToolkit();
            Dimension screenSize = jToolkit.getScreenSize();
            this.setLocation((int) (screenSize.getWidth() / 4), (int) (screenSize.getHeight() / 4));
        } 
        catch (AWTError ex) 
        {
            log.error(MainWindow.class.getName(), ex);
        }
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);


        button = new JButton("Add Task");
        button.setSize(120, 40);
        button.setLocation(340, 30);
        button.addActionListener(new ButtonEventListenerAddTask());
        panel.add(button);

        button = new JButton("Delete Task");
        button.setSize(120, 40);
        button.setLocation(340, 75);
        button.addActionListener(new ButtonEventListenerDelTask());
        panel.add(button);

        button = new JButton("Change Task");
        button.setSize(120, 40);
        button.setLocation(340, 120);
        button.addActionListener(new ButtonEventListenerChangeTask());
        panel.add(button);

        button = new JButton("Show Contacts");
        button.setSize(120, 40);
        button.setLocation(20, 180);
        button.addActionListener(new ButtonEventListenerShowContact());
        panel.add(button);

        this.setContentPane(panel);
        window = this;

    }

    /**
     * слушатель события клик, на кнопке Add Task
     * открывает новое окно для добавления Task 
     * @implements ActionListener
     */
    class ButtonEventListenerAddTask implements ActionListener 
    {

        public void actionPerformed(ActionEvent e) 
        {
            AddWindow app = new AddWindow(0,client,window);
            app.setVisible(true);
            setVisible(false);
        }
    }
    
    /**
     * слушатель события клик, на кнопке Delete Task
     * выдает сообщение о подверждении удаления выбраного Task.
     * удаляет выбраный Task из списка и передает его id в метод удаления класса TaskList
     */
    class ButtonEventListenerDelTask implements ActionListener 
    {
        public void actionPerformed(ActionEvent e) 
        {
            if(label.getText().equals("")) JOptionPane.showMessageDialog(null,"don't select ", "Output",JOptionPane.PLAIN_MESSAGE);
            else
            {
                Object[] options = { "Yes", "No" };
                int n = JOptionPane.showOptionDialog(null, "Delete this task?",
                        "Confirmation", JOptionPane.YES_NO_OPTION,
                        JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
                if (n == 0) 
                {
                    String temp[][] = new String[taskArray.length - 1][8];
                    int sel = table.getSelectedRow();
                    int j = 0;
                    for (int i = 0; i < taskArray.length; i++) 
                    {
                        if (i == sel) continue;
                        temp[j++] = taskArray[i];
                    }
                    taskArray = temp;
                    modelTable.removeRow(sel);
                    table.setModel(modelTable);
                    client.setTaskList(taskArray);
                    log.info("Delete task");
                }
            }
        }
    }
    
    /**
     * слушатель события клик, на кнопке Change Task
     * открывает окно для изменения выбранного Task.
     * Передает id Task в метод изменения Task класса ChangeWindow     *
     */
    class ButtonEventListenerChangeTask implements ActionListener 
    {

        public void actionPerformed(ActionEvent e) 
        {
            if(label.getText().equals("")) JOptionPane.showMessageDialog(null,"don't select ", "Output",JOptionPane.PLAIN_MESSAGE);
            else
            { 
                ChangeWindow cw = new ChangeWindow(0,table.getSelectedRow(),client,window);
                cw.setVisible(true);
                setVisible(false);
            }
        }
    }
    
    /**
     * слушатель события клик, на записи таблицы Task
     * определяет id выбранного Task из таблицы
     */
    class tableSelectionEvent implements javax.swing.event.ListSelectionListener
    {
            public void valueChanged(javax.swing.event.ListSelectionEvent e) 
            {
                    String result = "";
                    int[] selectedRows = table.getSelectedRows();
                    for(int i = 0; i < selectedRows.length; i++) 
                    {
                         int selIndex = selectedRows[i];
                         TableModel model = table.getModel();
                         Object value = model.getValueAt(selIndex, 3);
                         result = result + value;
                    }
                    label.setText(result);
                    label.setVisible(false);
                    panel.add(label);
               } 
    }
    
    /**
     * слушатель события клик, на кнопке Show Contact
     * вызывает окно класса ShowContact
     */
    class ButtonEventListenerShowContact implements ActionListener 
    {

        public void actionPerformed(ActionEvent e) 
        {
            ShowContact app = new ShowContact(client);
            app.setVisible(true);
        }
    }
}
